#!/usr/bin/env python3
# -*- coding: utf-8 -*-
##############################################
# @Author: DengLibin 榆霖
# @Date: Create in 2022-03-07 11:18:27
# @Description: 
##############################################
'module name'
__author__ = 'DengLibin'



# 传统的生产者-消费者模型是一个线程写消息，一个线程取消息，通过锁机制控制队列和等待，但一不小心就可能死锁。

# 如果改用协程，生产者生产消息后，直接通过yield跳转到消费者开始执行，待消费者执行完毕后，切换回生产者继续生产，效率极高：


# 是一个生成器
def consumer():
    r = 'start'
    print('consumer start')
    while True:
        n = yield r
        print('n = %s' % n)
        if not n:
            return
        print('[CONSUMER] Cosuming %s...' % n)
        r = '200 OK'


def produce(c):
    print('producer start')
    # 首先调用c.send(None)启动生成器
    c.send(None) # 只能传None用于启动生成器
    n = 0
    while n  < 5:
        n += 1
        print('[PRODUCEER] Productin %s...' % n)
        # 然后，一旦生产了东西，通过c.send(n)切换到consumer执行，produce拿到consumer处理的结果，继续生产下一条消息；
        r = c.send(n)
        print('[PRODUCER] Consumer return: %s' % r)
    # produce决定不生产了，通过c.close()关闭consumer，整个过程结束。    
    c.close()

if __name__ == '__main__':
    print('----------------------------------------------------------------')
    # 生成器
    c = consumer()
    produce(c)
